// 1.es6模块 需要能转化成不能同的模块方式  commonjs规范 （require,exports）， amd模块 (define)  导出的是amd 需要配置file入口
// umd: 支持直接进行转化
// import a from "./module/a";

// 2.如果需要使用commonjs 需要安装  pnpm i --save-dev @types/node
// commonjs 规范 可以转化成amd
// const a = require("./module/a");
// console.log(a);

// target 指代的是语法
// module 导出的模块规范是什么

// 3.ts中为了 能做到 commonjs 和 amd的互转 ，自己发明了一种写法 (export = / import = )
// import a from "./module/a";

// import a = require("./module/a");
// console.log(a);

// 4.我们基本用不到 export =  和 import = ,我门可以直接采用es6module
// import a from "./module/a"; // 直接采用esModule

// import {}
// import {xxx as xxx}
// import()

// 外部模块的使用
// .cjs 是commonjs规范  .mjs在node中使用es模块

// esModule  es6规范 import export
// umd 模块   统一规范 支持 commonjs和 amd
// commonjs node来使用的 require module.exports
// amd  requirejs来使用的 define([],function(){})
// iife  立即执行函数   var name = (function(){})()
// systemjs  为微端使用的

// 最终编写的代码 我门需要将其转化成js来去使用 ， 需要给打包后的结果添加类型
// .d.ts

// 1.打包后只生产js  没有类型了. 可以开启配置中自动生成类型文件 （你的代码得使用ts来编写的）
// 2.我门使用了一个js包，没有ts的类型, 需要自己编写 ，也可以安装 npm i --save-dev @types/jquery
// 3.通过cdn外链了一个js库, 也需要声明文件
// 4.扩展全局的属性的时候 也需要写声明文件
// 5.特殊文件的处理也需要声明文件
// import jquery from "jquery";

// 为了让我门在写代码的时候 不会导致编码丢失类型
// declare 主要是用于声明类型的 (全局声明)

// let person: Person2 = {
//   a: 2,
// };
// console.log(Season.Spring);

// 1） 通过cdn的方式引入的全局变量 ， 我门可以自己写类型让他支持 （不报错）
// $(".ele").height(30).width(30);
// $.ajax("/url", {});
// $.fn.extend({});

import mitt, { Type, Listener } from "mitt";

const fn: Listener = function () {};
mitt.on("data", fn);
mitt.off("data", function () {});
mitt.emit("data", function () {});

// 导入的是一个值， 这个值我希望有类型
import comp from "a.vue";
console.log(comp);

import jpg from "a.jpg";
console.log(jpg);

import css from "a.css";

// 标识这个属性是全局的global的
/* declare global {
    interface String {
    my(prefix: string): this;
    }
 }*/
String.prototype.my = function (prefix: string) {
  return prefix + this;
};
window.store;
// 如果有人已经给这个模块编写好类型了，我门就可以直接用人家的来操作

export {};

//.

// 类型声明...........................................................
// 有些代码使用cdn 引入的， 没有类型提示
// 或者有些包使用js 来写的没有提示,没有类型提示
// 有些模块导入的格式不是js或者ts ,没有类型提示
// 解决==>添加声明文件 添加声明文件为统一管理而不影响核心代码。我们将声明的内容都放入到.d.ts文件中
console.log(globalAge);
// 我写好的声明放到.d.ts中，ts默认会检测当前项目下所有的.d.ts，因为include,默认查找全部文件
// 找声明文件默认是找整个项目中，也可以手动指定加载目录 ，让ts,监测特定文件
// src/**/*表示src下所有目录，所有文件  **表示所有目录 *所有文件
// 让ts,监测特定文件 tsconfig.json 加 "include": ["src/**/*" ]
// 让ts,排除特定文件 tsconfig.json 加 "exclude": ["src/**/*" ]

// 有些代码使用cdn 引入的，让它有类型提示
$("abvc").width(100).height(100);

// mitt 有些包使用js，让它有类型提示
import mitt1 from "mitt1";
mitt1.on("data", function () {});
mitt1.emit("data", "a", "b", "c");

//非js 或者ts 后缀的模块，让它有类型提示
import jpg1 from "a.jpg";


//我们在查找第三方模块是如何查找 xxx模块
import xxx from "xxx”;
//  
// 找到 node modules/xxx/package.json 先找types字段
// "exports": {
//   "types"":"./ index.d.ts",
//   "module": "./dist/mitt.mjs", 
//  "import": "./dist/mitt.mjs"
//   "require": "./dist/mitt.js"
//  "default": "./dist/mitt.mjs"
// }
// 找到 node modules/xxx/package.json 先找types字段
// node modules/xxx/index.d.ts
//node_modules/@types/index.d.ts 如果当前模块不是ts写的，有些声明文件是别人写好的我们可以安装 例如jquery可以安装 @types/jquery
// 

/* 

其他的声明文件代码
import _ = require("./index')
declare module './index'{
function x():void
function y():void
function z():void
}

// 三斜线指令，类似于在声明文件中引入其他的声明文件
/// <reference path="./lodash a.d.ts"/> 引入自定义的
/// <reference types="sizzle"/> 引入第三方的模块
/// <reference lib="./lodash a.d.ts"/> 引入内置的模块


//types=“node” 可以指定引入的某个内置包(第三方)  /// <reference types="sizzle"/>
//lib="dom”可以指定依赖的内置ts声明 /// <reference lib="dom"/>
declare namespace _{
function a(): void;
function b(): void;
function c(): void;
}
//写成模块后，就不能直接用了，需要导入后再用,这个是处理当引入模块有import export
export = _
// 当前模块可以不导入直接使用(umd模块 umd模块相当于window._ = -,在不是作用域的文件中可以直接使用) 
// 这个是处理当引入模块没有import export，并且为umd模块 时
export as namespace _ 


// 下面的写法，可以避免私有属性被暴露.....................................................

 // 其他的声明文件代码 
import _ = require("./index')
declare module './index'{
   // 这样可以避免私有属性被暴露
  // ...........
interface ILodäsh {
x(): void
y():void
z():void
  s}
}


// 这样可以避免私有属性被暴露 
// ./index.d.ts 的内容
/// <reference path="./lodash a.d.ts"/>
declare namespace _ {
  // 这样可以避免私有属性被暴露
  // ...........
  interface ILodash{
    a(): void;
    b(): void;
    c(): void;
  }
}
// 这样可以避免私有属性被暴露
declare const _:_.ILodash
//写成模块后，就不能直接用了，需要导入后再用,这个是处理当引入模块有import export
export = _
// 当前模块可以不导入直接使用(umd模块 umd模块相当于window._ = -,在不是作用域的文件中可以直接使用) 
// 这个是处理当引入模块没有import export，并且为umd模块 时
export as namespace _ 




*/
